home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / comm2 / xprz351s.lha / XprZmodem.h < prev    next >
C/C++ Source or Header  |  1995-01-03  |  14KB  |  271 lines

  1. /*
  2.  *  xprzmodem.h: Definitions for xprzmodem.library and xprzedzap.library;
  3.  *  Version 2.0, 28 October 1989, by Rick Huebner.
  4.  *  Released to the Public Domain; do as you like with this code.
  5.  *
  6.  *  Version 2.63, 30 July 1993 build in locale, by Rainer Hess
  7.  *
  8.  *  Version 2.64, 3 Aug 1993 global variable Blocksize, now in
  9.  *                struct Vars, by Rainer Hess
  10.  *  Version 3.2   11 Nov 1994 
  11.  *                restored FTN support
  12.  *                reduced modem output buffer for faster error receovery
  13.  *                increased pktbuf size
  14.  *                added NewBaud, link bps
  15.  *                added booleans FTNmode, dzap, Nofiles, Smallblocks
  16.  *                added options c,z,q,n
  17.  *                added prototype for KPrintF when KDEBUG is true
  18.  *                by Robert Williamson
  19.  */
  20.  
  21. /* #define DEBUGLOG 1 */
  22.  
  23. /* Return codes */
  24. #define OK        0
  25. #define ERROR   (-1)
  26. #define TIMEOUT (-2)
  27. #define RCDO    (-3)
  28.  
  29. /* Relevant control characters */
  30. #define CR        ('M' & 0x1F)        /* ^M */
  31. #define DLE       ('P' & 0x1F)        /* ^P */
  32. #define XON       ('Q' & 0x1F)        /* ^Q */
  33. #define XOFF      ('S' & 0x1F)        /* ^S */
  34. #define CAN       ('X' & 0x1F)        /* ^X */
  35. #define CPMEOF    ('Z' & 0x1F)        /* ^Z */
  36.  
  37. /* Misc. program constants */
  38. #define LZMANAG          0        /* Default ZMODEM file management mode */
  39. #define LZTRANS          0        /* Default ZMODEM file transport mode */
  40.  
  41. #define PATHLEN        256        /* What's the max legal path size? */
  42. #define CONFIGLEN       32        /* Max length of transfer options string */
  43.  
  44. #define KSIZE         8192        /* Max allowable packet size */
  45. #define MINBLOCK        64        /* Min allowable packet size */
  46. #define MAXGOODNEEDED 8192        /* Max # good bytes req'd to bump packet size */
  47. #define MAXRXTO        600
  48. #define MINRXTO         10
  49.  
  50. /* Provision for future 7-bit ZMODEM; for now, there's no difference */
  51. #define sendline xsendline
  52.  
  53. /*
  54.  * Replacement for global variables normally used, in order to make code
  55.  * fully reentrant; each invocation allocs their own Vars, and passes the
  56.  * struct pointer down through the entire program so they're always available.
  57.  * Pointer to this struct is usually able to be a register variable, so access
  58.  * is no worse than any stack variable (all register-relative).  Kinda
  59.  * kludgey, but the original ZModem code design depended on lots of globals,
  60.  * and I didn't want to redesign the whole damn thing.  Besides, it's more
  61.  * efficient than constantly pushing & popping args all over the place.
  62.  */
  63.  
  64. struct Vars
  65. {
  66.   struct XPR_IO io;                   /* Copy of XProto IO struct passed by term prog. */
  67.   struct XPR_UPDATE __aligned xpru;   /* Scratchpad xpr_update() control struct */
  68.   struct timeval __aligned Starttime; /* Time transfer started */
  69.   UBYTE __aligned Rxhdr[4];           /* Received header */
  70.   UBYTE Txhdr[4];                     /* Transmitted header */
  71.   UBYTE Msgbuf[128];                  /* Scratchpad buffer for printing messages */
  72.   UBYTE Filename[PATHLEN];            /* Name of the file being up/downloaded */
  73.   UBYTE Pktbuf[KSIZE];                /* File data packet buffer */
  74.   UBYTE Modembuf[KSIZE * 2 + 256];    /* Input buffer for data from modem */
  75.   UBYTE Outbuf[KSIZE * 2 + 256];      /* Output buffer for data to modem */  
  76.   UBYTE *Modemchar;                   /* Next char to get from Modembuf */
  77.   UBYTE *Filebuf;                     /* File I/O buffer address */
  78.   UBYTE *Filebufptr;                  /* Current position within Filebuf */
  79.   long File;                          /* Handle of file being transferred */
  80.   long Oldstatus;                     /* Original terminal program's modem settings */
  81.   long Baud;                          /* BPS setting of modem */
  82.   long Strtpos;                       /* Starting byte position of transfer */
  83.   long Fsize;                         /* Size of file being transferred */
  84.   long Rxbytes;                       /* Number of bytes received so far */
  85.   long Filebufpos;                    /* File offset of data in Filebuf */
  86.   long Filebufmax;                    /* Size of Filebuf */
  87.   long Filebuflen;                    /* Number of bytes currently stored in Filebuf */
  88.   long Filebufcnt;                    /* Number of bytes remaining/written in Filebuf */
  89.   long Rxpos;                         /* Received file position */
  90.   long Txpos;                         /* Transmitted file position */
  91.   short Filcnt;                       /* Number of files opened for transmission */
  92.   short Errcnt;                       /* Number of files unreadable */
  93.   short Noroom;                       /* Flags 'insufficient disk space' errors */
  94.   short Rxbuflen;                     /* Largest frame they're willing to xfer */
  95.   short Tframlen;                     /* Largest frame we're willing to xfer */
  96.   short Rxtimeout;                    /* Tenths of seconds to wait for something */
  97.   short Tryzhdrtype;                  /* Header type to send corresp to Last rx close */
  98.   short Modemcount;                   /* Number of bytes available in Modembuf */
  99.   short Outbuflen;                    /* Number of bytes currently stored in Outbuf */
  100.   short Rxframeind;                   /* ZBIN or ZHEX; type of frame received */
  101.   short Txfcs32;                      /* TRUE means send binary frame with 32 bit FCS */
  102.   short Rxflags;                      /* Temp register */
  103.   short Wantfcs32;                    /* want to send 32 bit FCS */
  104.   short Crc32t;                       /* Display flag indicates 32 bit CRC being sent */
  105.   short Crc32;                        /* Display flag indicates 32 bit CRC being recd */
  106.   short Rxtype;                       /* Type of header received */
  107.   short Rxcount;                      /* Count of data bytes received */
  108.   short Znulls;                       /* Number of nulls to send at begin of ZDATA hdr */
  109.   short ErrorLimit;                   /* How many sequential errors before abort */
  110.   char Rxbinary;                      /* Force binary mode download? */
  111.   char Rxascii;                       /* Force text mode download? */
  112.   char Thisbinary;                    /* Receive this file in binary mode? */
  113.   char Lzconv;                        /* Suggested binary/text mode for uploads */
  114.   char Eofseen;                       /* Text-mode EOF marker (^Z) rec'd on download? */
  115.   UBYTE Zconv;                        /* ZMODEM file conversion request */
  116.   UBYTE Zmanag;                       /* ZMODEM file management request */
  117.   UBYTE Ztrans;                       /* ZMODEM file transport request */
  118.   UBYTE Lastsent;                     /* Last text char written by putsec() */
  119.   UBYTE Lastzsent;                    /* Last char sent by zsendline() */
  120.   UBYTE Fileflush;                    /* Flush file I/O buffer before closing? */
  121.   UBYTE Attn[ZATTNLEN + 1];           /* Attention string rx sends to tx on err */
  122.   long Ksize;                         /* Max allowable packet size for this session */
  123.   long NewBaud;                       /* BPS link rate passed in xpr options */
  124.   char FTNmode;                       /* change parameters for FTN operations */
  125.   char NoFiles;                       /* allow no file send for FTN operations */
  126.   char SmallBlocks;                   /* we are in pure zmodem 1024 bytes  */ 
  127.   char dzap;                          /* escape only ZDLE/ZDLEE if true */
  128.   char NoMask;                        /* disable XPR 2.001/3 masks */
  129.   short StartTimeout; 
  130. };
  131.  
  132. /*
  133.  * Option settings and other variables needed outside of XProtocolSend/Receive;
  134.  * separated from rest of Vars so that huge Vars struct doesn't have to be
  135.  * allocated except during transfers.  Pointer to this struct kept in xpr_data.
  136.  */
  137. struct SetupVars
  138.   {
  139.     UBYTE *matchptr, *bufpos;
  140.     short buflen;
  141.     UBYTE option_t[2], option_o[2], option_b[8], option_f[8], option_e[8], option_s[4];
  142.     UBYTE option_r[4], option_a[4], option_d[4], option_k[4], option_p[256], option_m[8];
  143.     UBYTE option_c[8], option_n[4], option_q[4], option_z[4], option_y[4], option_x[8];
  144.   };
  145.  
  146. /* Function prototypes */
  147.  
  148. long __saveds __asm XProtocolSend (register __a0 struct XPR_IO *xio);
  149. short getzrxinit (struct Vars *v);
  150. void sendbatch (struct Vars *v);
  151. short sendone (struct Vars *v);
  152. short sendname (struct Vars *v);
  153. short zsendfile (struct Vars *v, short blen);
  154. short zsendfdata (struct Vars *v);
  155. short getinsync (struct Vars *v);
  156. void saybibi (struct Vars *v);
  157.  
  158. long __saveds __asm XProtocolReceive (register __a0 struct XPR_IO *xio);
  159. short rcvbatch (struct Vars *v);
  160. short tryz (struct Vars *v);
  161. short rzfiles (struct Vars *v);
  162. short rzfile (struct Vars *v);
  163. short procheader (struct Vars *v);
  164. short putsec (struct Vars *v);
  165. void ackbibi (struct Vars *v);
  166.  
  167. long __saveds __asm XProtocolSetup (register __a0 struct XPR_IO *xio);
  168. long __saveds __asm XProtocolCleanup (register __a0 struct XPR_IO *xio);
  169. long __saveds __asm XProtocolHostMon (
  170.                                        register __a0 struct XPR_IO *xio,
  171.                                        register __a1 char *serbuff,
  172.                                        register __d0 long actual,
  173.                                        register __d1 long maxsize);
  174. long __saveds __asm XProtocolUserMon (
  175.                                        register __a0 struct XPR_IO *xio,
  176.                                        register __a1 char *serbuff,
  177.                                        register __d0 long actual,
  178.                                        register __d1 long maxsize);
  179. struct Vars *setup (struct XPR_IO *io);
  180. UBYTE *find_option (UBYTE * buf, UBYTE option);
  181. void set_textmode (struct Vars *v);
  182. void canit (struct Vars *v);
  183. void zmputs (struct Vars *v, UBYTE * s);
  184. void xsendline (struct Vars *v, UBYTE c);
  185. void sendbuf (struct Vars *v);
  186. short readock (struct Vars *v, short tenths);
  187. char char_avail (struct Vars *v);
  188. void update_rate (struct Vars *v);
  189. long bfopen (struct Vars *v, UBYTE * mode); 
  190. /*void *bfopen (struct Vars *v, UBYTE * mode);  ZEDZAP */
  191. void bfclose (struct Vars *v);
  192. void bfseek (struct Vars *v, long pos);
  193. long bfread (struct Vars *v, UBYTE * buf, long length);
  194. long bfwrite (struct Vars *v, UBYTE * buf, long length);
  195. void ioerr (struct XPR_IO *io, char *msg);
  196. void updstatus (struct Vars *v, char *filename, long status, long mask);
  197. void upderr (struct Vars *v, char *msg, long mask);
  198. void updmsg (struct Vars *v, char *msg, long mask);
  199. long getfree (void);
  200. char exist (struct Vars *v);
  201.  
  202. #ifdef DEBUGLOG
  203. void dlog (struct Vars *v, UBYTE * s);
  204. #define DEBUGINFO (xprsprintf(v->Msgbuf, "Source: %-10s  Func: %-12s  Line: %4ld\n",__FILE__,__FUNC__,__LINE__), dlog(v, v->Msgbuf))
  205.  
  206. #ifdef DEBUGLEVEL2
  207. #define D(x) x
  208. #else
  209. #define D(x) ;
  210. #endif
  211. #endif
  212.  
  213. void zsbhdr (struct Vars *v, USHORT type);
  214. void zshhdr (struct Vars *v, USHORT type);
  215. void zsdata (struct Vars *v, short length, USHORT frameend);
  216. short zrdata (struct Vars *v, UBYTE * buf, short length);
  217. short zrdat32 (struct Vars *v, UBYTE * buf, short length);
  218. short zgethdr (struct Vars *v);
  219. short zrbhdr (struct Vars *v);
  220. short zrbhdr32 (struct Vars *v);
  221. short zrhhdr (struct Vars *v);
  222. void zputhex (struct Vars *v, UBYTE c);
  223. void zsendline (struct Vars *v, UBYTE c);
  224. short zgethex (struct Vars *v);
  225. short zdlread (struct Vars *v);
  226. short noxrd7 (struct Vars *v);
  227. void stohdr (struct Vars *v, long pos);
  228. long rclhdr (struct Vars *v);
  229.  
  230. /* xprzmodem_timers.c */
  231. extern ULONG UnixTimeOffset;
  232. ULONG getsystime (struct timeval *tv);
  233. void XprTimeOut(long ticks);
  234. LONG xprsprintf (STRPTR buffer, STRPTR fmt,...);
  235.  
  236.  
  237. extern STRPTR GetLocalString(struct LocaleInfo *, LONG);
  238.  
  239. #ifdef KDEBUG
  240. void KPrintF(UBYTE *fmt,...);
  241. #endif
  242.  
  243. /* callbacks */
  244. /*  callbacks.a  is  glue to call XPR callback functions in comm program from */
  245. /* inside XPR library.  This protects our registers from potential bugs in the */
  246. /* comm program which might change them in unexpected ways.  */
  247. /*  The  prototypes  put all arguments into the registers required by the XPR */
  248. /* spec, so we don't have to move anything around. */
  249.  
  250. void * __asm xpr_fopen(register __a3 struct XPR_IO *io,register __a0 char *filename,register __a1 char *accessmode);
  251. void __asm xpr_fclose(register __a3 struct XPR_IO *io,register __a0 void *fileptr);
  252. long __asm xpr_fread(register __a3 struct XPR_IO *io,register __a0 char *buffer,register __d0 long size,register __d1 long count,register __a1 void *fileptr);
  253. long __asm xpr_fwrite(register __a3 struct XPR_IO *io,register __a0 char *buffer,register __d0 long size,register __d1 long count,register __a1 void *fileptr);
  254. long __asm xpr_sread(register __a3 struct XPR_IO *io,register __a0 char *buffer,register __d0 long size,register __d1 long timeout);
  255. long __asm xpr_swrite(register __a3 struct XPR_IO *io,register __a0 char *buffer,register __d0 long size);
  256. long __asm xpr_sflush(register __a3 struct XPR_IO *io);
  257. void __asm xpr_update(register __a3 struct XPR_IO *io,register __a0 struct XPR_UPDATE *updatestruct);
  258. long __asm xpr_chkabort(register __a3 struct XPR_IO *io);
  259. long __asm xpr_chkmisc(register __a3 struct XPR_IO *io);
  260. long __asm xpr_gets(register __a3 struct XPR_IO *io,register __a0 char *prompt,register __a1 char *buffer);
  261. long __asm xpr_setserial(register __a3 struct XPR_IO *io,register __d0 long newstatus);
  262. long __asm xpr_ffirst(register __a3 struct XPR_IO *io,register __a0 char *buffer,register __a1 char *pattern);
  263. long __asm xpr_fnext(register __a3 struct XPR_IO *io,register __d0 long oldstate,register __a0 char *buffer,register __a1 char *pattern);
  264. long __asm xpr_finfo(register __a3 struct XPR_IO *io,register __a0 char *filename,register __d0 long typeofinfo);
  265. long __asm xpr_fseek(register __a3 struct XPR_IO *io,register __a0 void *fileptr,register __d0 long offset,register __d1 long origin);
  266. long __asm xpr_options(register __a3 struct XPR_IO *io,register __d0 long n,register __a0 struct xpr_option **opt);
  267. long __asm xpr_unlink(register __a3 struct XPR_IO *io,register __a0 char *filename);
  268. long __asm xpr_squery(register __a3 struct XPR_IO *io);
  269. long * __asm xpr_getptr(register __a3 struct XPR_IO *io,register __d0 long type);
  270. /* End of XprZmodem.h source */
  271.